package br.com.ozsolucoes.sessionbeans;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import br.com.ozsolucoes.entity.Cliente;
import br.com.ozsolucoes.entity.PessoaFisica;
import br.com.ozsolucoes.entity.PessoaJuridica;

@Stateless
public class ClienteSessionBean {

	@PersistenceContext
	private EntityManager entityManager;

	public void cadastrarCliente(Cliente cliente) {
		cliente.setId(0);
		entityManager.persist(cliente);
	}

	public void alterarCliente(Cliente cliente) {
		entityManager.merge(cliente);
	}
	
	public void excluirCliente(Cliente cliente) {
		long idCliente = cliente.getId();
		cliente = entityManager.find(PessoaFisica.class, cliente.getId());
		if (cliente == null) {
			cliente = entityManager.find(PessoaJuridica.class, idCliente);
		}
		entityManager.remove(cliente);
	}

	public boolean validaLogin(String usuario, String senha) {
		Query query = entityManager.createNamedQuery("Cliente.validaLogin");
		query.setParameter("usuario", usuario);
		query.setParameter("senha", senha);
		try {
			query.getSingleResult();
			return true;
		} catch (NoResultException e) {
			return false;
		}
	}
	public Cliente consultarClientePorUsuarioSenha(String usuario, String senha) {
		Query query = entityManager.createNamedQuery("Cliente.validaLogin");
		query.setParameter("usuario", usuario);
		query.setParameter("senha", senha);
		try {
			return (Cliente) query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}

	public Object consultarClientesPorID(long idCliente) {
		Query query = entityManager.createNamedQuery("Cliente.consultarPorID");
		query.setParameter("idCliente", idCliente);
		try {
			return query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}

	public boolean verificaExisteUsuario(String usuario) {
		Query query = entityManager.createNamedQuery("Cliente.consultarUsuarioPorUsuario");
		query.setParameter("usuario", usuario.toUpperCase());
		try {
			query.getSingleResult();
			return true;
		} catch (NoResultException e) {
			return false;
		}
	}

	public boolean verificaExisteIdentificadorAlterarCliente(String usuario, long idCliente) {
		Query query = entityManager.createNamedQuery("Cliente.consultarUsuarioPorUsuario");
		query.setParameter("usuario", usuario.toUpperCase());
		try {
			Cliente cliente = new Cliente();
			cliente = (Cliente) query.getSingleResult();
			if (cliente.getId() == idCliente) {
				return false;
			} else {
				return true;
			}
		} catch (NoResultException e) {
			return false;
		}
	}

	public boolean verificaExisteEmailAlterarCliente(String email, long idCliente) {
		Query query = entityManager.createNamedQuery("Cliente.verificaExisteEmail");
		query.setParameter("email", email.toLowerCase());
		try {
			Cliente cliente = new Cliente();
			cliente = (Cliente) query.getSingleResult();
			if (cliente.getId() == idCliente) {
				return false;
			} else {
				return true;
			}
		} catch (NoResultException e) {
			return false;
		}
	}

	public boolean verificaExisteEmail(String email) {
		Query query = entityManager.createNamedQuery("Cliente.verificaExisteEmail");
		query.setParameter("email", email.toLowerCase());
		try {
			query.getSingleResult();
			return true;
		} catch (NoResultException e) {
			return false;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Cliente> consultarClientePorEmailLista(String email) {
		Query query = entityManager.createNamedQuery("Cliente.consultarPorEmailLista");
		query.setParameter("email", "%" + email.toLowerCase() + "%");
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	public Cliente consultarClientePorEmail(String email) {
		Query query = entityManager.createNamedQuery("Cliente.consultarPorEmail");
		query.setParameter("email", email.toLowerCase());
		try {
			return (Cliente) query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Cliente> consultarClientePorUsuarioLista(String usuario) {
		Query query = entityManager.createNamedQuery("Cliente.consultarPorUsuarioLista");
		query.setParameter("usuario", "%" + usuario.toLowerCase() + "%");
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	public Cliente consultarClientePorUsuario(String usuario) {
		Query query = entityManager.createNamedQuery("Cliente.consultarPorUsuario");
		query.setParameter("usuario", usuario.toLowerCase());
		try {
			return (Cliente) query.getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}

	@SuppressWarnings("unchecked")
	public List<Cliente> consultarTodosClientes() {
		Query query = entityManager.createNamedQuery("Cliente.consultarTodosClientes");
		try {
			return query.getResultList();
		} catch (NoResultException e) {
			return null;
		}
	}
	
}
